์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ตœ์ƒ์œ„ ๊ฐ€์ ธ์˜ค๊ธฐ: ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ํŒจํ„ด | MLOG | MLOG
            
// app.js
import * as api from './api.js';
import axios from 'axios';

await api.initialize(axios);

const data = await api.fetchData('/api/data');
console.log(data);

            

์—ฌ๊ธฐ์„œ api.js ๋ชจ๋“ˆ์€ ์™ธ๋ถ€ http ํด๋ผ์ด์–ธํŠธ(axios)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. fetchData๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— api.initialize๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธ์Šคํ„ด์Šค์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. app.js์—์„œ TLA๋Š” ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ axios๊ฐ€ api ๋ชจ๋“ˆ์— ์ฃผ์ž…๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

5. ์ดˆ๊ธฐํ™”๋œ ๊ฐ’ ์บ์‹ฑ

๋ฐ˜๋ณต์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ๊ณผ์ •์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ:

            
// data.js
let cachedData = null;

async function fetchData() {
  console.log('Fetching data...');
  // Simulate fetching data from an API
  await new Promise(resolve => setTimeout(resolve, 1000));
  return { message: 'Data from API' };
}

export async function getData() {
  if (!cachedData) {
    cachedData = await fetchData();
  }
  return cachedData;
}

export default await getData(); // Export the promise directly


            
            
// main.js
import data from './data.js';

console.log('Main script started');

data.then(result => {
  console.log('Data available:', result);
});

            

์ด ์˜ˆ์ œ์—์„œ data.js๋Š” TLA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. getData ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๊ฐ€์ ธ์™€์ง€๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. data.js๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์€ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ์œ„ Await ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์˜ˆ์ œ:

            
// data.js
try {
  const response = await fetch('/api/data');
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  export const data = await response.json();
} catch (error) {
  console.error('Failed to fetch data:', error);
  export const data = { error: 'Failed to load data' }; // Provide a fallback
}

            

์ด ์˜ˆ์ œ๋Š” TLA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. try...catch ๋ธ”๋ก์€ fetch ์ž‘์—… ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์žก์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“ˆ์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€์ฒด ๊ฐ’์ด ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค

1. ๋Œ€์ฒด(Fallback) ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ

TLA๋Š” ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋‚˜ A/B ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ:

            
// feature.js
let featureModule;

try {
  featureModule = await import('./feature-a.js');
} catch (error) {
  console.warn('Failed to load feature A, falling back to feature B:', error);
  featureModule = await import('./feature-b.js');
}

export default featureModule;

            

2. WebAssembly ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™”

TLA๋Š” WebAssembly ๋ชจ๋“ˆ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” WebAssembly ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์™„์ „ํžˆ ๋กœ๋“œ๋˜๊ณ  ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ:

            
// wasm.js
const wasmModule = await WebAssembly.instantiateStreaming(fetch('module.wasm'));

export const { instance } = wasmModule;

            

์ „์—ญ์  ๊ณ ๋ ค์‚ฌํ•ญ

์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

๊ฒฐ๋ก 

์ตœ์ƒ์œ„ Await๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. TLA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊นจ๋—ํ•˜๊ณ , ๊ฐ€๋…์„ฑ ๋†’์œผ๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” TLA๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ํŒจํ„ด์„ ์‹ค์ œ ์˜ˆ์ œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ํƒ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ง€์นจ์„ ๋”ฐ๋ฅด๋ฉด TLA๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒฌ๊ณ ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ์ˆ˜์šฉํ•˜๋ฉด ๋” ํšจ์œจ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ด์–ด์ ธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํ˜์‹ ์ ์ด๊ณ  ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

TLA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด TLA๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋ณต์žกํ•˜๊ณ  ์ •๊ตํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.